In [1]:
# numpy と pandas を import する。np, pd と書くのは慣習っぽい
import numpy as np
import pandas as pd
In [13]:
# Series
# 軸にラベルを付けた1次元の配列
print(pd.Series([1,2,4]))
# 値とインデックスを設定
s = pd.Series([1,2,4], index=['a','b','c'])
print(s)
print(s.index)
In [14]:
print('最大値:', s.max())
print('最小値:', s.min())
print('平均値:', s.mean())
print('中央値:', s.median())
print('分散:', s.var()) # variance
print('合計値:', s.sum())
In [20]:
print('剰余:')
print(s.mod(2)) # modulo, 剰余
print('\n累積:')
print(s.cumsum()) # cumulative, 累積
print('\n関数を適用:')
print(s.apply(lambda x: x*3)) # 特定の関数を各値に対して適応
print('\n値を変換:')
print(s.map({1: 10, 2: 200})) # 引数で与えた値に対応する値を変換
In [23]:
print('最大値のindex:', s.argmax())
print('最小値のindex:', s.argmin())
print('listに変換:', s.tolist())
print('dictに変換:', s.to_dict())
print('jsonに変換:', s.to_json())
In [25]:
# DataFrameの作成
df = pd.DataFrame([[1, 4, 7], [2, 5, 8], [3, 6, 9]],
index = ['i1', 'i2', 'i3'],
columns = list("abc"))
df
Out[25]:
In [30]:
# 範囲を指定して取り出す
# 指定した行の取り出し。index名かindex番号で与えられる
print('i1行目のデータ:')
print(df.ix['i1'])
print('\n1行目のデータ:')
print(df.ix[1])
print('\ni1行目のa列のデータ:')
print(df.ix['i1', 'a'])
# : は全指定
print('\na列のデータ:')
print(df.ix[:, 'a'])
# 複数の指定も配列で可能。
print(df.ix[[1, 2], ['b','c']])
print(df.ix[[1, 2], [1, 2]])
In [32]:
# 列の指定
print('a列の全データ:')
print(df['a'])
print ('\na列の全データをarrayで取得')
print(df['a'].values)
print ('\na列とindex(i3)を指定して値を取得')
print(df['a']['i3'])
In [39]:
# iloc(integer-location) だと位置で指定できる
print(df.iloc[0]) # 0行目
print(df.iloc[0, 1]) # 0行目1列目
print(df.iloc[:,0]) # 0列目
In [8]:
# 条件を満たす要素に値を代入
df = pd.DataFrame(np.random.randint(3, size=(5,3)))
print(df)
# 条件を満たす要素だけを抽出する
print(df[df>1])
print(df[df==1])
# 条件を満たすものに値を代入
df[df>1] = -1
print(df)
In [15]:
# NaN の削除(dropna)
df = pd.DataFrame([[1, 2, None], [3, None, 4], [5, 6, 7]])
print(df)
# なんでintとfloatまざってるんだろう...
print(df.dropna()) # NaN を含む行を削除
print(df.dropna(axis=1)) # NaN を含む列を削除
print(df.dropna(subset=[1])) # 特定の列を指定することも可能
In [18]:
# NaN を埋める(fillna)
print(df)
print(df.fillna(-1)) # 指定した値で埋める
print(df.fillna(method='pad')) # 直前の値で埋める
print(df.fillna(method='bfill')) # 直後の値で埋める
In [19]:
# misssing valueの前後の線形の値で埋める
print(df)
print(df.apply(pd.Series.interpolate))
In [32]:
# 重複した値の処理(dupulicated)
df = pd.DataFrame([['a', 1], ['a', 1], ['a', 2], ['b', 3], ['b', 4]])
print(df)
print(df.duplicated()) # 重複しているデータを調べる
print(df.duplicated(0)) # 0列の重複しているデータを調べる
print(df.duplicated(1))
In [38]:
# 重複したデータの削除
print(df.drop_duplicates())
print(df.drop_duplicates(0)) # 0列目が重複しているデータの削除
print(df.drop_duplicates(0, keep='last')) # 重複している時に一番最後のデータを残す
In [68]:
df = pd.DataFrame(np.reshape(np.arange(9), (3, 3)),
columns=['a', 'b', 'c'])
df
Out[68]:
In [47]:
# DataFrameの一部を取り出す
print(df.head(2)) # 先頭2行
print(df.tail(2)) # 後ろ2行
In [48]:
print(df.index) # インデックス(行の情報を取得)
print(df.columns) # 列の情報を取得
In [49]:
# DataFrameの形式を変える
print(df.T) # indexとcolumnsを入れ替える
In [50]:
df.sort_index(axis=1, ascending=False) # columnsを逆順にする
Out[50]:
In [51]:
df.sort_values(by='b', ascending=False) # 列の値を使ってソートする
Out[51]:
In [52]:
df.sort_values(by='b') # 列の値を使ってソートする
Out[52]:
In [53]:
# マスクする(ほしい条件のもとで、dfから選びとる)
print(df.a)
print(df.a > 2)
df[df.a > 2] # a列の値が2より大きいデータだけを取り出す
Out[53]:
In [54]:
df[df > 3] # 3より大きい値だけを取り出す
Out[54]:
In [57]:
new_df = df.copy()
new_df[new_df > 3] = new_df * 2 # 3より大きい値だけ2倍する
new_df
Out[57]:
In [70]:
# 列の追加
new_df = df.copy()
new_df['e'] = ['one','two','three']
new_df
Out[70]:
In [72]:
# NaNのデータを除去する
# http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html
df_with_nan = df[df > 3]
df_with_nan
Out[72]:
In [73]:
df_with_nan.dropna() # NaNがある行を削除
Out[73]:
In [74]:
df_with_nan.dropna(how='all') # 全てがNaNの行を削除
Out[74]:
In [75]:
# http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
df_with_nan.fillna('Ice') # NaNを別な値で埋める
Out[75]:
In [76]:
# DataFrameをくっつける
# http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html#pandas.concat
df2 = pd.DataFrame(np.reshape(np.arange(6), (3,2)),
columns=['e', 'f'])
df2
Out[76]:
In [78]:
# 列でくっつける
new_df = pd.concat([df, df2], axis=1)
new_df
Out[78]:
In [81]:
# 行でくっつける
new_df = pd.concat([df, df2], axis=0)
new_df
Out[81]:
In [82]:
df3 = pd.DataFrame(np.reshape(np.arange(6), (3,2)),
columns=['a', 'b'])
df3
Out[82]:
In [83]:
new_df = pd.concat([df, df3], axis=0)
new_df
Out[83]:
In [85]:
# 行に対してデータを追加する
# http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html#pandas.DataFrame.append
new_df = df.append(df3)
new_df
Out[85]:
In [86]:
Out[86]:
In [ ]: